﻿#pragma once

#include "Card.h"
#include <set>
#include <iterator>

namespace Cards {

	/**
	* Klasa pomocnicza, opakowująca zbiór kart i zapewniająca takie operacje jak przecięcie zbiorów
	*/
	class CardSet
	{
		std::set<Card*> cards; /**< Wewnętrzny zbiór kart */

	public:
		CardSet(void); /**< Inicjalizuje zbiór pustymi wartościami */

		/**
		* Klasa iteratora po zbiorze kart, wzorowana na iteratorach z std::
		*/
		class Iterator: public std::iterator<std::input_iterator_tag, Card*>
		{
			friend class CardSet;
			std::set<Card*>::iterator iterator;
			Iterator(std::set<Card*>::iterator foo);
		public:
			Iterator& operator++();
			Iterator operator++(int);
			bool operator==(const Iterator& rhs) const;
			bool operator!=(const Iterator& rhs) const;
			Card* operator*();
		};

		/**
		* Dodaje kartę do zbioru
		* @param card Dodawana karta
		*/
		void add(Card* card);
		/**
		* Zwraca iterator na poczatek zbioru
		*/
		Iterator begin() const;
		/**
		* Zwraca iterator na koniec zbioru
		*/
		Iterator end() const;
		/**
		* @param card Karta do sprawdzenia
		* @return Prawda, jeśli zbiór zawiera podaną kartę
		*/
		bool contains(Card*);
		/**
		* @return Prawda, jeśli zbiór jest pusty
		*/
		bool empty();
		/**
		* @return Liczba elementów zbioru
		*/
		int size() const;
		/**
		* Sprawdza, czy dwa zbiory zawierają te same karty
		*/
		bool operator==(const CardSet& rhs);
		/**
		* Dokonuje przecięcia zbiorów
		* @param set Zbiór kart do porównania
		* @return Zbiór kart, które występują w każdym z dwóch zbiorów
		*/
		CardSet intersect(CardSet&);
	};

}
